/*
 * Proyecto Manejador de Proyectos
 * @Autor Hector Hurtado
 */
package Mproyectos.modelo;

import Mproyectos.entidades.Proyecto;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.Stateless;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
//import org.apache.log4j.Logger;

/**
 * Clase que que implementa el acceso a la persistencia
 */
@ViewScoped
@Stateless
public class FachadaProyecto {

    /**
     * Manejador de entidades
     */
    @PersistenceContext(unitName = "ManejadorProyectosPU")
    private EntityManager em;

    /**
     * Adiciona un programa. Si el proyecto ya existe lanza una excepcion
     *
     * @param proyecto a adicionar
     */
    public void adicionar(Proyecto proyecto) {
        em.persist(proyecto);
    }

    /**
     * Actualiza un proyecto. Actualiza los datos del proyecto
     *
     * @param proyecto a adicionar
     */
    public void actualizar(Proyecto proyecto) {
        em.merge(proyecto);
    }

    /**
     * Elimina el concierto .
     *
     * @param proyecto a eliminar
     */
    public void eliminar(Proyecto proyecto) {
        em.remove(em.merge(proyecto));
    }

    /**
     * Busca el proyecto con el titulo dado. Retorna null si no existe
     *
     * @param titulo del proyecto
     * @return null si el proyecto no existe o el objeto proyecto
     */
    public Proyecto buscar(Proyecto titulo) {
        return em.find(Proyecto.class, titulo);
    }

    /**
     * Busca el proyecto con el titulo dado. Retorna null si no existe
     *
     * @param titulo del proyecto
     * @return null si el proyecto no existe o el objeto proyecto
     */
    public Proyecto buscarPorTitulo(String titulo) {
        return em.find(Proyecto.class, titulo);
    }

    /**
     * Retorna TODOS los Proyectos que se han almacenado
     *
     * @return Lista con los Proyectos
     */
    public Collection<Proyecto> listar() {
        Query query = em.createQuery("SELECT a FROM Proyecto a ");
        return (Collection<Proyecto>) query.getResultList();
    }

    /**
     * Retorna el Proyecto que con un nombre en parrticular
     *
     * @return Proyecto
     */
    public Proyecto getProyecto(String titulo) {
        Query query = em.createQuery("SELECT a FROM Proyecto a WHERE  titulo='" + titulo + "'");
        return (Proyecto) query.getSingleResult();
    }

    /**
     * Retorna los Proyectos que se han almacenado y hacen parte de un programa
     * en particular
     *
     * @return Lista con los Proyectos por programa
     */
    public Collection<Proyecto> listarPorPrograma(String programa) {
        Query query = em.createQuery("SELECT a FROM Proyecto a WHERE  a.programa.nombre='" + programa + "'");
        return (Collection<Proyecto>) query.getResultList();
    }

    /**
     * Retorna los Proyectos que se han almacenado y fueron registrados en un
     * periodo
     *
     * @return Lista con los Proyectos por periodo
     */
    public Collection<Proyecto> listarPorPeriodo(int año, String semestre) {
        System.out.println("Buscando " + año);
        Query query = em.createQuery("SELECT a FROM Proyecto a WHERE  a.año=" + año + " AND a.semestre='" + semestre + "'");
        return (Collection<Proyecto>) query.getResultList();
    }

    /**
     * Retorna los Proyectos que se contengan las palabras claves seleccionadas
     *
     * @return Lista con los Proyectos con las palabras claves seleccionadas
     */
    public Collection<Proyecto> listarPorPalabrasClave(String palabra) {



        Query query = em.createQuery("SELECT p FROM PalabraClave p  ");

        // Collection<Proyecto> proyectos = (Collection<Proyecto>) query.getResultList();

        //    Collection<Proyecto> listaProyectos = new ArrayList<Proyecto>();
//        for (Proyecto proyecto : proyectos) {
//            if(proyecto.getPalabrasClave().contains(palabra))
//             listaProyectos.add(proyecto);
//        }
//         listaProyectos;

        return (Collection<Proyecto>) query.getResultList();
    }
}